"""
通过process模块创建进程, 该模块创建的子进程是无法使用input()函数的.
process属性:
    p.name: 进程名称
    p.pid: 对应子进程pid号
    p.is_alive(): 查看子进程是否在生命周期内
    p.daemon: 设置父子进程的退出关系
        如果设置为True则子进程会随父进程的退出而结束
        要求必须在start()函数,执行前设置
        如果daemon设置成True通常就不会使用join()函数
"""

import multiprocessing as mp
from time import *


def fun(sec, name):
    print("第一个子进程")
    sleep(sec)
    print("子进程结束", name)
    
def fun1(sec, name):
    print("第二个子进程")
    sleep(sec)
    print("子进程结束", name)
    
def fun2(sec, name):
    print("第三个子进程")
    sleep(sec)
    print("子进程结束", name)

print("这是父进程")

# 利用列表的特性, 使其想要开多进程的函数,进行挨个遍历, 进程回收也是同理
li = [fun, fun1, fun2]
hui = []
for i in li:
    si = mp.Process(target = i, args=(1, "张三"), name = '阿巴阿巴')  # 实例化模块, args是位置参数, name是进程名称,如果另取名字,有多个进程的话,名字全是一样的,不会递增后缀
    si.start()  # 启动进程
    hui.append(i) # 追加以及启动过的子进程,方便回收
    print("父进程------------------")
    # 属性
    print(f"进程名称: {si.name}\n对应子进程pid号: {si.pid}\n子进程是否在生命周期内: {si.is_alive()}")

# 进程回收
for item in hui:
    item.join()  # 结束进程
    print(si.pid)


 
print("这是父进程")  # 如果子进程没有结束的, 这条以及后面的代码都不会执行, 其效果与os.fork()一样的

